﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
//class Person {
//public:
//	virtual void BuyTicket() { cout << "买票-全价" << endl; }
//};
//class Student : public Person {
//public:
//	//virtual
//	// void BuyTicket() { cout << "买票-打折" << endl; }
//};
//void Func(Person* ptr)
//{
//	// 这⾥可以看到虽然都是Person指针Ptr在调⽤BuyTicket 
//	// 但是跟ptr没关系，⽽是由ptr指向的对象决定的。 
//	ptr->BuyTicket();
//}
//int main()
//{
//	Person ps;
//	Student st;
//	Func(&ps);
//	Func(&st);
//	return 0;
//}

//class A
//{
//public:
//	virtual void func(int val = 1) { 
//		std::cout << "A->" << val << std::endl;
//	}
//	virtual void test() { 
//		func();
//	}
//};
//
//class B : public A
//{
//public:
//	void func(int val = 0) { 
//		std::cout << "B->" << val << std::endl; 
//	}
//};
//
//int main(int argc, char* argv[])
//{
//	B* p = new B;
//	p->test();
//	return 0;
//}

//class A {
//public: void test(float a) { cout << a; } 
//}; 
//class B :public A { 
//public: void test(int b) { cout << b; }
//};
//void main() { 
//	A* a = new A;
//	B* b = new B; 
//	a = b; 
//	a->test(1.1); 
//}

//// error C3668: “Benz::Drive”: 包含重写说明符“override”的⽅法没有重写任何基类⽅法 
//class Car {
//public:
//	virtual void Dirve () 
//	{}
//};
//class Benz :public Car {
//public:
//	virtual void Drive() override
//	{ cout << "Benz-舒适" << endl; }
//};
//int main()
//{
//	return 0;
//}

//class A {
//public:
//
//	void f1() { cout << "A::f1()" << endl; }
//
//	virtual void f2() { cout << "A::f2()" << endl; }
//
//	virtual void f3() { cout << "A::f3()" << endl; }
//};
//
//class B : public A
//{
//
//public:
//
//	virtual void f1() { cout << "B::f1()" << endl; }
//
//	virtual void f2() { cout << "B::f2()" << endl; }
//
//	void f3() { cout << "B::f3()" << endl; }
//
//};
//int main() {
//	A* a=new A;
//	B* b=new B;
//	//a = b;
//	a->f2();
//	b->f1();
//	a->f1();
//	return 0;
//}

//class A
//{
//public:
//	virtual void Drive() = 0;
//
//};
//
//int mian() {
//	A* p;
//	return 0;
//}

//class Person {
//public:
//	virtual void BuyTicket() { cout << "买票-全价" << endl; }
//private:
//	string _name;
//};
//class Student : public Person {
//public:
//	virtual void BuyTicket() { cout << "买票-打折" << endl; }
//private:
//	string _id;
//};
//class Soldier : public Person {
//public:
//	virtual void BuyTicket() { cout << "买票-优先" << endl; }
//private:
//	string _codename;
//};
//void Func(Person* ptr)
//{
//	// 这⾥可以看到虽然都是Person指针Ptr在调⽤BuyTicket 
//	// 但是跟ptr没关系，⽽是由ptr指向的对象决定的。 
//	ptr->BuyTicket();
//}
//int main()
//{
//	// 其次多态不仅仅发⽣在派⽣类对象之间，多个派⽣类继承基类，重写虚函数后 
//	// 多态也会发⽣在多个派⽣类之间。 
//	Person ps;
//	Student st;
//	Soldier sr;
//	Func(&ps);
//	Func(&st);
//	Func(&sr);
//
//	return 0;
//}

//class A{
//
//public:
//
//    virtual void f()
//
//    {
//
//        cout << "A::f()" << endl;
//
//    }
//
//};
//
//
//
//class B : public A{
//
//private:
//
//    virtual void f()
//
//    {
//
//        cout << "B::f()" << endl;
//
//    }
//
//};
//
//
//int main() {
//    A* pa = (A*)new B;
//
//    pa->f();
//
//    return 0;
//}

//class A
//
//{
//
//public:
//
//    A() :m_iVal(0) { test(); }
//
//    virtual void func() { std::cout << m_iVal << ' '; }
//
//    void test() { func(); }
//
//public:
//
//    int m_iVal;
//
//};
//
//
//
//class B : public A
//
//{
//
//public:
//
//    B() { test(); }
//
//    virtual void func()
//
//    {
//
//        ++m_iVal;
//
//        std::cout << m_iVal << ' ';
//
//    }
//
//};
//
//
//
//int main(int argc, char* argv[])
//
//{
//
//    A* p = new B;
//
//    p->test();
//
//    return 0;
//
//}
